package org.pictual.controller;

/*
	http://translate.google.com/translate_tts?tl=es&q=casa
	http://translate.google.com/translate_tts?tl=en&q=house
	http://translate.google.com/translate_tts?tl=es&q=la+casa+roja
	http://translate.google.com/translate_tts?tl=en&q=my+taylor+is+rich
	http://translate.google.com/translate_tts?tl=fr&q=voulez+vous+coucher+avec+moi+ce+soir
	http://translate.google.com/translate_tts?tl=de&q=du+du+hast+du+hast+mich
	http://translate.google.com/translate_tts?tl=en&q=Is+this+the+real+life?+Is+this+just+fantasy?+Caught+in+a+landside,+No+escape+from+reality
	http://translate.google.com/translate_tts?tl=es&q=se+oye+comentar+a+las+gentes+del+lugar+los+rockeros+no+son+buenos
	http://translate.google.com/translate_tts?tl=en&q=pictual
	http://translate.google.com/translate_tts?tl=es&q=pictual
	http://translate.google.com/translate_tts?tl=fr&q=pictual
	http://translate.google.com/translate_tts?tl=de&q=pictual
 */
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.Reader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.List;

import javax.swing.text.html.parser.ParserDelegator;

import org.apache.log4j.Logger;
import org.pictual.util.ConstantsKeys;
import org.pictual.util.GetLinks;
import org.pictual.util.OggInputStream;
import org.pictual.util.gsearch.Client;
import org.pictual.util.gsearch.Result;

public class WikiDescargaOGG {

	protected static Logger log= Logger.getLogger(WikiDescargaOGG.class);
	
	private String urlAudio;
	private String urlOGG;
	private static String audio;
	private final String rutaDirectorio="ogg/";
	
	public WikiDescargaOGG(String audio){
		this.audio = audio;
	}
	
	public String processDownload(){
		
		try {	
			log.info("Audio: "+audio);
			urlAudio="http://commons.wikimedia.org/wiki/File:"+audio+".ogg";
			log.info("URL del Audio de Commons: "+urlAudio);
			if(urlAudio!=null){
				URL url = new URL(urlAudio);
				Reader reader= new InputStreamReader((InputStream) url.getContent());
		
				new ParserDelegator().parse(reader, new GetLinks(), true);
				urlOGG=GetLinks.oggLink;
			}
			
			log.info("URL del OGG obtenida de Wiki: "+urlOGG);
	//		if(urlOGG!=null) downloadOGG(urlOGG);
			if(urlOGG!=null) uploadImageByFTP(urlOGG);
			log.info("El archivo se ha subido al ftp");
//			else{
//				urlOGG=readHTMLAudio(gSearchPageURL(audio));
//				downloadOGG(urlOGG);
//			}
//			log.info("Archivo OGG descargado en: "+rutaDirectorio);
		} catch (MalformedURLException e) {
			log.error("Error al descargar el archivo de audio, error en la URL", e);
		} catch (IOException e) {
			log.error("Error al descargar el archivo de audio", e);

		}
			
		return urlOGG;
		
	}
	
	/**
	 * Método que busca en google el audio para obtener su URL (No esta en uso)
	 * @param audio
	 * @return
	 */
	public String gSearchPageURL(String audio){
		Client client = new Client();
		
		List<Result> resultados=client.searchWeb(audio+" filetype:ogg");
		
		if(!resultados.isEmpty()){
			log.info("No esta vacio");
			for(Result r: resultados){
				log.info("URL: "+r.getUrl());
				return r.getUrl() ;
			}
		}
		
		return null;
	}
	
	public String readHTMLAudio(String urlAudio){
		
		try {
	         // Se abre la conexión
	         URL url = new URL(urlAudio);
	         URLConnection conexion = url.openConnection();
	         conexion.connect();
	         
	         // Lectura
	         InputStream is = conexion.getInputStream();
	         BufferedReader br = new BufferedReader(new InputStreamReader(is));
	         char[] buffer = new char[1000];
	         int leido;
	         String lineaHTML;
	         String trozoCodigo = null;
	         while ((leido = br.read(buffer)) > 0) {
	        	 lineaHTML=new String(buffer, 0, leido);
	        	 if(lineaHTML.contains("<div class=\"fullMedia\">")){
	        		 trozoCodigo=lineaHTML;
	        		 break;
	        	 }
	         }
	         log.info(trozoCodigo);
	        
	        String a = null;
	        int c=0, d=0;
			if(trozoCodigo!=null)
				c=audio.length()+".ogg".length();
				d="href=\"".length();
				log.info(c+","+d);
	        	 a = "http:"+trozoCodigo.substring( trozoCodigo.indexOf("href=\"//upload.wikimedia.org/wikipedia/")+d, trozoCodigo.indexOf(audio+".ogg")+c );
	        	 log.info(a);
	        	return a;
	                
	      } catch (MalformedURLException e) {
	         log.error("MalformedURLException");
	      } catch (IOException e) {
	    	 log.error("IOException");
	      }
		
		return null;
	}
	
	public void downloadOGG(String urlOGG){
		try {
			// Url con la foto
			URL url = new URL(urlOGG);

			// establecemos conexion
			URLConnection urlCon = url.openConnection();

			// Sacamos por pantalla el tipo de fichero
			log.info("Tipo de fichero: "+urlCon.getContentType());

			// Se obtiene el inputStream de la foto web y se abre el fichero
			// local.
			InputStream is = urlCon.getInputStream();
//			FileOutputStream fos = new FileOutputStream("C:/desarrollo/proyectos/pictual/Pictual_100612/Pictual/WebContent/ogg/"+audio+".ogg");
			
//			File miDir = new File (".");
//			String ruta=miDir.getCanonicalPath()+"/ogg/"+audio+".ogg";
//			log.info("Guardare el archivo en: "+ruta);
			FileOutputStream fos = new FileOutputStream(Controlador.getRuta()+"WebContent/"+rutaDirectorio+audio+".ogg");
			
			// Lectura de la foto de la web y escritura en fichero local
			byte[] array = new byte[1000]; // buffer temporal de lectura.
			int leido = is.read(array);
			while (leido > 0) {
				fos.write(array, 0, leido);
				leido = is.read(array);
			}

			// cierre de conexion y fichero.
			is.close();
			fos.close();
		} catch (Exception e) {
			log.error("Error al descargar el fichero");
		}
	}
	
	/**
	* Método para subir un archivo local a un servidor FTP
	* tenemos que pasarle los datos de:
	* ip o hostname del servidor
	* usuario
	* contraseña
	* la ruta completa del fichero local a subir
	* la ruta en donde queramos colocar el archivo en el servidor FTP
	* ej: uploadFileByFTP("servidor", "usuario", "contraseña", "c:\\prueba.txt", "/mi_dir/prueba.txt");
	*/
	
	public static String uploadImageByFTP(String urlOGG) {
//		String urlAudio="http://commons.wikimedia.org/wiki/File:"+audio+".ogg";
		try {
			
			//Lee la url y obtiene un InputStream
			///////////////////////////////////////////
			// Url con la foto
			URL url = new URL(urlOGG);
	
			// establecemos conexion
			URLConnection urlCon = url.openConnection();
	
			// Sacamos por pantalla el tipo de fichero
			log.debug(urlCon.getContentType());
			
	
			// Se obtiene el inputStream de la foto web y se abre el fichero
			// local.
			InputStream is = urlCon.getInputStream();
//			System.out.println(is.markSupported());
//			
//			AudioInputStream ais =  AudioSystem.getAudioInputStream(is);
//			BufferedInputStream bufferedInputStream = new BufferedInputStream(ais);
//			ais = new AudioInputStream(bufferedInputStream, ais.getFormat(), ais.getFrameLength());
			
			
			///////////////////////////////////////////
			
//			AudioInputStream stream;
//			AudioInputStream decodedStream;
//			AudioFormat format;
//			AudioFormat decodedFormat;
//			boolean stop;
			
//			log.debug(urlAudio);
			// Get AudioInputStream from given file.
//			stream = AudioSystem.getAudioInputStream(url);
//			decodedStream = null;
//			if (stream != null) {
//				format = stream.getFormat();
//				decodedFormat = new AudioFormat(
//						AudioFormat.Encoding.PCM_SIGNED,
//						format.getSampleRate(), 16,
//						format.getChannels(),
//						format.getChannels() * 2,
//						format.getSampleRate(), false);
//				// Get AudioInputStream that will be decoded by underlying
//				// VorbisSPI
//				decodedStream = AudioSystem.getAudioInputStream(
//						decodedFormat, stream);
//			}
//			
			
			
			//Obtiene un File del InputStream
			///////////////////////////////////////////
			File f=new File(audio+".ogg");
//			AudioInputStream ais =  AudioSystem.getAudioInputStream(f);
			OutputStream salida=new FileOutputStream(f);
			
			
			// Create OGG Decoder
//			OggDecoder oggDecoder = new OggDecoder();
//			
//			OggData oggData = oggDecoder.getData(is);
			
			OggInputStream oggInputStream = new OggInputStream(is);
			
//			AudioInputStream ais = AudioSystem.getAudioInputStream(oggInputStream);
//			InputStream inputStream = new ByteArrayInputStream(oggData.data.array());
			
//			InputStream inputStream = OggData
			
			
//			AudioInputStream a=AudioSystem.getAudioInputStream(url);
//			AudioInputStream a=AudioSystem.getAudioInputStream(new FileInputStream(f));
//			AudioInputStream a=AudioSystem.getAudioInputStream(new BufferedInputStream(new FileInputStream(f)));
//			  AudioFormat audioFormat = a.getFormat();
//			  BufferedInputStream bufferedInputStream = new BufferedInputStream(a);
//			a = new AudioInputStream(bufferedInputStream, a.getFormat(), a.getFrameLength());

			  
			byte[] buf =new byte[1024];
			int len;
			while((len=oggInputStream.read())>0){
				salida.write(buf,0,len);
			}
//			ais.close();
		
			
			
			//Obtiene un BufferedImage del File y escribe una imagen 
			//////////////////////////////////////////////
	
			String ftp=
					"ftp://" + ConstantsKeys.USER_FTP +
					":" + ConstantsKeys.PASS_FTP + 
					"@" + ConstantsKeys.SERVER_FTP + 
					ConstantsKeys.PATH_FTP_AUDIOS + 
					"/"+audio+".ogg" + ";type=i";
			
			
			log.debug("URL del ftp: "+ftp);
			URL urlFTP = new URL(ftp);
			URLConnection urlc = urlFTP.openConnection();
			OutputStream os = urlc.getOutputStream();
//			BufferedReader br = new BufferedReader(new FileReader(f));
//			BufferedImage imagen = ImageIO.read(f);
//			ImageIO.write(imagen, format, os);
			
			BufferedReader br = new BufferedReader(new FileReader(f));
			int c;
			while ((c = br.read()) != -1) {
			os.write(c);
			}
//			
			os.flush();
			os.close();
			salida.close();
			return ConstantsKeys.PATH_IMAGES + "/" + audio + ".ogg";
		} catch (Exception e) {
			log.error("Error al subir el fichero al ftp", e);
			return null;
		}
	}
	
	public static void main(String[] args) {
		new WikiDescargaOGG("Buenas_noches").processDownload();
		
//		new WikiDescargaOGG("Buenas_noches").uploadImageByFTP();
	}
}
